package com.xuecheng.content.config;

import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.core.toolkit.support.SFunction;
import org.apache.commons.lang3.StringUtils;

import java.util.function.BiConsumer;
import java.util.function.Supplier;

//**T**: 实体类类型（如 User）
//**D**: 参数 DTO 类型（包含查询条件的对象）
//**wrapper**: MyBatis-Plus 的动态查询构造器
//**paramsDto**: 存储查询参数的 DTO 对象
public class QueryWrapperBuilder<T, D> {

    private final LambdaQueryWrapper<T> wrapper;
    private final D paramsDto;

    public QueryWrapperBuilder(LambdaQueryWrapper<T> wrapper, D paramsDto) {
        this.wrapper = wrapper;
        this.paramsDto = paramsDto;
    }

    /**
     * 添加条件：当参数非空时应用操作
     * @param paramGetter 参数提取函数（如 DTO::getField）
     * @param queryAction 查询操作（如 wrapper::eq）
     * @param fieldGetter 实体字段引用（如 Entity::getField）
     */
    public <R> QueryWrapperBuilder<T, D> addCondition(Supplier<R> paramGetter, BiConsumer<SFunction<T, ?>, R> queryAction, SFunction<T, ?> fieldGetter) {
        R paramValue = paramGetter.get();
        if (paramValue != null) {
            // 特殊处理：字符串类型需要检查非空
            if (paramValue instanceof String) {
                if (StringUtils.isNotBlank((String) paramValue)) {
                    queryAction.accept(fieldGetter, paramValue);
                }
            } else {
                queryAction.accept(fieldGetter, paramValue);
            }
        }
        return this;
    }



    /**
     * 添加模糊查询条件
     * @param paramGetter 参数提取函数
     * @param fieldGetter 实体字段引用
     */
    public QueryWrapperBuilder<T, D> addLikeCondition(Supplier<String> paramGetter, SFunction<T, String> fieldGetter) {
        return addCondition(paramGetter, wrapper::like, fieldGetter);
    }

    /**
     * 添加等值查询条件
     * @param paramGetter 参数提取函数
     * @param fieldGetter 实体字段引用
     */
    public <R> QueryWrapperBuilder<T, D> addEqCondition(Supplier<R> paramGetter,SFunction<T, R> fieldGetter) {
        return addCondition(paramGetter, wrapper::eq, fieldGetter);
    }
}